"""
执行测试用例生成测试报告

将临时报告生成为html的报告

发送报告

清理报告
"""
import json

# 导所需的包
import pytest, os, time,shutil
from common.send_email import SendEmail
# 修改报告窗口标题：set_window_title
def set_wiindow_title(new_name,file_path):
    # 1、以读的方式打开index.html文件，并保存到对象中
    f = open(f"{file_path}/index.html","r",encoding="utf-8")
    # 1.1、读取文件内所有的内容
    all_lines = f.readlines()
    # 1.2、关闭文件
    f.close()
    # 2、以写的方式打开index.html文件，并保存到对象w中
    w = open(f"{file_path}/index.html","w",encoding="utf-8")
    # 2.1、遍历每一行内容，将allure Report 报告替换成新的标题
    for line in all_lines:
        w.write(line.replace("Allure Report", new_name))
    # 2.2、关闭文件
    w.close()

# 修改报告内标题：config_title
def config_title(new_name,file_path):
    # 获取summary.json文件的数据内容
    file_path = f"{file_path}/widgets/summary.json"
    # 以读的方式打开并保存到对象f内
    f = open(file_path,"rb")
    # 加载json文件内的内容到变量param内
    param = json.load(f)
    # 修改内容
    param["reportName"] = new_name
    # 关闭文件
    f.close()

    # 将修改后的内容保存到字典内
    w = open(file_path,"w",encoding="utf-8")
    # 以写的方式再次打开文件，并写入修改后的数据
    json.dump(param,w,ensure_ascii=False,indent=4)
    # 关闭
    w.close()


# 1、清理报告--全部删除
# def auto_clear():
#     # 获取报告路径下面所有文件名
#     dir = f"{os.path.dirname(__file__)}/testReport/"
#     file_list = os.listdir(dir)
#     print(file_list)
#     # 逐个删除
#     for i in file_list:
#         shutil.rmtree(dir + i)
# 2、保留部分报告。
def auto_clear(n):
    # 获取报告路径下面所有文件名
    dir = f"{os.path.dirname(__file__)}/testReport/"
    file_list = os.listdir(dir)
    print(file_list)
    # 对文件列表进行排序，按照创建时间进行排序
    file_list.sort(key=lambda x: os.path.getctime(dir+x))
    # -n切片删除，n等于几就保留最后几个
    for i in file_list[:-n]:
        shutil.rmtree(dir + i)

if __name__ == '__main__':
    # 定义一个时间格式
    cur_time = time.strftime("%Y-%m-%d-%H：%M：%S")
    # 设置报告的存放路径
    report = os.path.dirname(__file__)+f"/testReport/{cur_time}"    # 将路径按照时间段的格式进行格式化输出，这样就不会重复了
    path = os.path.dirname(__file__)+r"/testReport/temp"

    # 执行测试用例生成测试报告
    """
    --alluredir={path}:发送测试报告的位置，
    --clean-alluredir：清理之前的报告，然后存放新的报告
    -vs：
        v:输出调试信息，包括print打印的信息；
        s：显示更详细的信息
    """
    pytest.main(["-vs",f"--alluredir={path}","--clean-alluredir"])
    # 将临时报告生成为html的报告
    os.system(f"allure generate {path} -o {report}")
    # 修改报告标题
    set_wiindow_title("这是XX模块的测试报告", report)
    config_title("登录模块的",report)

    # 手动创建一个脚本，用于查看报告
    f = open(f"{report}/查看报告.bat","w",encoding="utf-8")
    f.write("allure open ./")
    f.close()

    # 将生成的测试报告压缩为zip包
    zip_dir = shutil.make_archive(base_name=f"{path}/测试报告",format="zip",root_dir=report)
    print(zip_dir)
    # 发送报告
    se = SendEmail()
    se.send(zip_dir)

    # 清理报告
    auto_clear(5)
